package com.xuecheng.content.service.impl;

import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.model.dto.CourseCategoryTreeDto;
import com.xuecheng.content.service.CourseCategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author 杨振华
 * @since 2023/8/30
 */
@Slf4j
@Service
public class CourseCategoryServiceImpl implements CourseCategoryService{

    @Autowired
    private CourseCategoryMapper courseCategoryMapper;

    /**
     * 课程分类树形结构查询
     *
     * @return
     */
    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {
        // 调用mapper查询出分类信息
        List<CourseCategoryTreeDto> categoryTreeDtoList = courseCategoryMapper.selectTreeNodes(id);

        // 封装List<CourseCategoryTreeDto>
        // List转为map，key就是节点id，value就是CourseCategoryTreeDto对象，目的是为了从map中获取子节点
        // value就是节点对象，不需要处理
        // (key1, key2) -> (key2) 当key重复时，以哪一个key为主
        // filter过滤到根节点，在这个项目里面不需要考虑根节点
        Map<String, CourseCategoryTreeDto> categoryTreeDtoMap = categoryTreeDtoList
                .stream()
                .filter(item -> !id.equals(item.getId()))
                .collect(Collectors.toMap(
                key -> key.getId(), value -> value, (key1, key2) -> (key2)
        ));

        List<CourseCategoryTreeDto> resultTree = new ArrayList<>();
        // 遍历list，找子节点
        // 一边遍历一边将子节点放在父节点的childrenTreeNodes中
        categoryTreeDtoList
                .stream()
                .filter(item -> !id.equals(item.getId()))
                .forEach(item -> {
                    // 向list写入元素
                    if (item.getParentid().equals(id)){
                        resultTree.add(item);
                    }
                    // 找节点的父节点
                    CourseCategoryTreeDto parentNodes = categoryTreeDtoMap.get(item.getParentid());
                    if (parentNodes != null) {
                        if (parentNodes.getChildrenTreeNodes() == null) {
                            // 创建list存子节点
                            parentNodes.setChildrenTreeNodes(new ArrayList<CourseCategoryTreeDto>());
                        }
                        // 找子节点放到childrenTreeNodes中
                        parentNodes.getChildrenTreeNodes().add(item);
                    }
                });


        return resultTree;
    }
}
